]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell-app: Add "discrete_gpu" option when launching apps
authorBastien Nocera <hadess@hadess.net>
Wed, 19 Oct 2016 13:43:37 +0000 (15:43 +0200)
committerBastien Nocera <hadess@hadess.net>
Fri, 21 Oct 2016 17:26:49 +0000 (19:26 +0200)
And adapt existing callers to the new API. This will allow us to
implement a way to launch applications on the discrete GPU for systems
where an "Optimus" system exists.

https://bugzilla.gnome.org/show_bug.cgi?id=773117

js/misc/util.js
js/ui/calendar.js
js/ui/components/autorunManager.js
js/ui/remoteSearch.js
js/ui/status/network.js
src/shell-app.c
src/shell-app.h

index 748c7b7d5b7b895701ef72d82fae48959956ab6a..7c6d1112499d4e52f8d487701dea804985eb9c7b 100644 (file)
@@ -94,7 +94,7 @@ function spawnApp(argv) {
                                                       Gio.AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION);
 
         let context = global.create_app_launch_context(0, -1);
-        app.launch([], context);
+        app.launch([], context, false);
     } catch(err) {
         _handleSpawnError(argv[0], err);
     }
index ec3732e00e639bc15082d19a3c2465e9b0d6f8f9..2ed812613581bfe17abf679cf50a4d98819a1094 100644 (file)
@@ -902,7 +902,7 @@ const EventsSection = new Lang.Class({
         let app = this._getCalendarApp();
         if (app.get_id() == 'evolution.desktop')
             app = Gio.DesktopAppInfo.new('evolution-calendar.desktop');
-        app.launch([], global.create_app_launch_context(0, -1));
+        app.launch([], global.create_app_launch_context(0, -1), false);
     },
 
     setDate: function(date) {
index 90a296161da2e5875e5aabea903a2973cb8d3e5a..4fd08f9cc87c67d89db31337b957884b38348840 100644 (file)
@@ -64,7 +64,8 @@ function startAppForMount(app, mount) {
 
     try {
         retval = app.launch(files, 
-                            global.create_app_launch_context(0, -1))
+                            global.create_app_launch_context(0, -1),
+                            false)
     } catch (e) {
         log('Unable to launch the application ' + app.get_name()
             + ': ' + e.toString());
index efe6bc28d874d951d938c3a9f5f0525a1707c94b..baeaa126908960147b48c294df35cbf37697a6be 100644 (file)
@@ -297,7 +297,7 @@ const RemoteSearchProvider = new Lang.Class({
         // the provider is not compatible with the new version of the interface, launch
         // the app itself but warn so we can catch the error in logs
         log('Search provider ' + this.appInfo.get_id() + ' does not implement LaunchSearch');
-        this.appInfo.launch([], global.create_app_launch_context(0, -1));
+        this.appInfo.launch([], global.create_app_launch_context(0, -1), false);
     }
 });
 
index 9f4293ab7ce2a98dbf23a9175fdf02bca5e58244..a9cc4d1e6500c5ed56659a78c5e5c16d77f5f60f 100644 (file)
@@ -1501,7 +1501,7 @@ const NMVPNSection = new Lang.Class({
         if (nItems > 1) {
             let appSys = Shell.AppSystem.get_default();
             let app = appSys.lookup_app('gnome-network-panel.desktop');
-            app.launch(0, -1);
+            app.launch(0, -1, false);
         } else {
             let connection = this._connections[0];
             Util.spawnApp(['gnome-control-center', 'network', 'show-device',
index 7f61dc369ada2ac538758e352c2c8b350af06590..b383d9ca539d1a37fadc16a03945699398c22ad3 100644 (file)
@@ -505,7 +505,7 @@ shell_app_activate_full (ShellApp      *app,
       case SHELL_APP_STATE_STOPPED:
         {
           GError *error = NULL;
-          if (!shell_app_launch (app, timestamp, workspace, &error))
+          if (!shell_app_launch (app, timestamp, workspace, FALSE, &error))
             {
               char *msg;
               msg = g_strdup_printf (_("Failed to launch ā€œ%sā€"), shell_app_get_name (app));
@@ -549,7 +549,7 @@ shell_app_open_new_window (ShellApp      *app,
    * as say Pidgin.  Ideally, we have the application express to us
    * that it supports an explicit new-window action.
    */
-  shell_app_launch (app, 0, workspace, NULL);
+  shell_app_launch (app, 0, workspace, FALSE, NULL);
 }
 
 /**
@@ -1200,12 +1200,14 @@ app_child_setup (gpointer user_data)
  * shell_app_launch:
  * @timestamp: Event timestamp, or 0 for current event timestamp
  * @workspace: Start on this workspace, or -1 for default
+ * @discrete_gpu: Whether to start on the discrete GPU
  * @error: A #GError
  */
 gboolean
 shell_app_launch (ShellApp     *app,
                   guint         timestamp,
                   int           workspace,
+                  gboolean      discrete_gpu,
                   GError      **error)
 {
   ShellGlobal *global;
@@ -1227,6 +1229,8 @@ shell_app_launch (ShellApp     *app,
 
   global = shell_global_get ();
   context = shell_global_create_app_launch_context (global, timestamp, workspace);
+  if (discrete_gpu)
+    g_app_launch_context_setenv (context, "DRI_PRIME", "1");
 
   ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL,
                                                    context,
index 7fc582a2a221ee6bc46a35575afc7f0ed7c1a515..f02f53a31e43be65faa9a9e4eab822013395747d 100644 (file)
@@ -54,6 +54,7 @@ gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace);
 gboolean shell_app_launch (ShellApp     *app,
                            guint         timestamp,
                            int           workspace,
+                           gboolean      discrete_gpu,
                            GError      **error);
 
 void shell_app_launch_action (ShellApp        *app,